#ifndef __CLASSES_H__
#define __CLASSES_H__

#include <math.h>
#include <QtNetwork/QNetworkAccessManager>
#include <gsl/gsl_math.h>
#include <gsl/gsl_sf_bessel.h>
#include <gsl/gsl_const_mksa.h>
#include <gsl/gsl_complex.h>
#include <gsl/gsl_complex_math.h>
#include <QString>
#include <QStringList>

class Integrals {
public:
    __complex__ double check;
    __complex__ double RES[9]; //results: RES[0,1,2] - rot, RES[3,4,5] - grad, RES[6,7,8] - j

    QString textParam;
    int difQ[4];

    int waveType,mI, nI; // индексы волны
    double f0,w,k;		//wave properties
    double a,b,Dist;				//geometry, Dist - distantion
    double alfa1,beta;
    //alfa1=1.679730692494703e3;
    //beta=2.254040047142475e3;
    __complex__ double alfa2,G1,G2;	//КОМПЛЕКСНАЯ ВЕЛИЧИНА
    //alfa2=
    float e1,m1,e2,m2;		//параметры сред
    double R,teta,fi,Z;		//coordinates
    //teta=Pi/3; fi=Pi/6;

    __complex__ double Rln[40],Tln[40],RlnQ[40],TlnQ[40],Delta;
    double VMN[100],MMN[100],EMN[100],HMN[100];//vmn,mmn;

    double cosa(double fis);	//cos(alfa)
    double cosb(double fis);
    double cosg(double fis);	//cos(gamma)
    double cosd(double fis);	//cos(delta)

    __complex__ double cexp(double rr); 	//Волновой множитель {exp(-ikr)/r}
    __complex__ double cexp0(double ro, double fis); 	//Волновой множитель {exp(ik ro cosg)}
    __complex__ double G(int);		//Постоянные Г1 и Г2

    __complex__ double Ero1(double ro,double fis);
    __complex__ double Efi1(double ro,double fis);
    __complex__ double Hro1(double ro,double fis);
    __complex__ double Hfi1(double ro,double fis);

    __complex__ double Ero2(double ro,double fis);
    __complex__ double Efi2(double ro,double fis);
    __complex__ double Hro2(double ro,double fis);
    __complex__ double Hfi2(double ro,double fis);

    double I1r,I1b,I0r,I0b;
    double K1r,K1b,K0r,K0b;
    double js1(double ro);		//Производная от функции Бесселя J1(alfa1*ro)
    double ys1(double ro);		//Производная от функции Бесселя Y1(alfa1*ro)

    double besselS(int,double);
    double besselS2(int,double);
    double besselSY(int,double);
    double zerosJs(int,int);
    double alfa();

private:
    double R1(double ro);	//Параметр R1
    __complex__ double Rs1(double ro);	//Параметр R'1
    __complex__ double S1(double ro);	//Параметр S1
    double Ss1(double ro);	//Параметр S'1

    __complex__ double ji1(double ro);	//Функция Бесселя от мнимого аргумента
    __complex__ double yi1(double ro);	//Функция Неймана от мнимого аргумента
    double js2(double);		//Производная от функции Бесселя J0(alfa2*ro) с мнимым аргументом
    __complex__ double ys2(double);		//Производная от функции Бесселя J0(alfa2*ro) с мнимым аргументом
};

#endif // __CLASSES_H__
